package com.pandaq.pandaqlib.loopbander;
import android.content.Context;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.util.TimeUtils;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
/**
* Created by PandaQ on 2016/9/8.
* email : 767807368@qq.com
*/
public class AutoScrollViewPager extends ViewPager implements IndicatorParentImbl {
private IndicatorListener mIndicatorListener;
private long delayTime = 5000;
private boolean isRunning = false;
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (isRunning && msg.what == 0) {
//让viewPager 滑动到下一页
AutoScrollViewPager.this.setCurrentItem(getCurrentItem() + 1, true);
handler.sendEmptyMessageDelayed(0, delayTime);
}
}
};
@Override
public void setIndicatorListener(IndicatorListener mIndicatorListener) {
this.mIndicatorListener = mIndicatorListener;
}
@Override
public int getIndicatorCount() {
return getCount();
}
@Override
public void startAutoScroll() {
if (!isRunning) {
isRunning = true;
handler.sendEmptyMessageDelayed(0, delayTime);
}
}
@Override
public void stopAutoScroll() {
isRunning = false;
handler.removeMessages(0);
}
@Override
public void onReDraw(int index) {
setCurrentItem(index);
}
public interface OnPageClickListener {
void onPageClick(AutoScrollViewPager pager, int position);
}
private PagerAdapter wrappedPagerAdapter;
private PagerAdapter wrapperPagerAdapter;
private InnerOnPageChangeListener listener;
private OnPageClickListener onPageClickListener;
public AutoScrollViewPager(Context context) {
super(context);
init();
}
public AutoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
listener = new InnerOnPageChangeListener();
super.addOnPageChangeListener(listener);
}
@Override
public void addOnPageChangeListener(OnPageChangeListener listener) {
this.listener.setOnPageChangeListener(listener);
}
public OnPageClickListener getOnPageClickListener() {
return onPageClickListener;
}
public void setOnPageClickListener(OnPageClickListener onPageClickListener) {
this.onPageClickListener = onPageClickListener;
}
@Override
public void setAdapter(PagerAdapter adapter) {
wrappedPagerAdapter = adapter;
//若设置的 adapter 不为空则对其进行包装
wrapperPagerAdapter = (wrappedPagerAdapter == null) ? null : new AutoScrollPagerAdapter(adapter);
super.setAdapter(wrapperPagerAdapter); //为viewPager设置的是包装的adapter
if (adapter != null && adapter.getCount() != 0) {
post(new Runnable() {
@Override
public void run() {
setCurrentItem(0, false);
}
});
}
startAutoScroll();
}
@Override
public PagerAdapter getAdapter() {
return wrappedPagerAdapter;
}
@Override
public void setCurrentItem(int item) {
super.setCurrentItem(item + 1);
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item + 1, smoothScroll);
}
@Override
public int getCurrentItem() {
int curr = super.getCurrentItem();
return getRealPosition(curr);
}
//根据虚拟获取真实位置
private int getRealPosition(int curr) {
if (wrappedPagerAdapter != null && wrappedPagerAdapter.getCount() > 1) {
if (curr == 0) {
curr = wrappedPagerAdapter.getCount() - 1;
} else if (curr == wrapperPagerAdapter.getCount() - 1) {
curr = 0;
} else {
curr = curr - 1;
}
}
return curr;
}
private int getCurrentItemOfWrapper() {
return super.getCurrentItem();
}
private int getCountOfWrapper() {
if (wrapperPagerAdapter != null) {
return wrapperPagerAdapter.getCount();
}
return 0;
}
private int getCount() {
if (wrappedPagerAdapter != null) {
return wrappedPagerAdapter.getCount();
}
return 0;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (MotionEventCompat.getActionMasked(ev)) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);
stopAutoScroll();
break;
case MotionEvent.ACTION_UP:
getParent().requestDisallowInterceptTouchEvent(false);
startAutoScroll();
break;
}
return super.onTouchEvent(ev);
}
private int lastPosition = 0;
private class InnerOnPageChangeListener implements OnPageChangeListener {
private OnPageChangeListener listener;
public InnerOnPageChangeListener() {
}
public void setOnPageChangeListener(OnPageChangeListener listener) {
this.listener = listener;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (!(position >= getCount() || position == 0)
|| (lastPosition == 0 && position == getCount())
|| (position == getCount() && lastPosition == getCount() - 1)) {
mIndicatorListener.moving(position - 1, positionOffset);
}
lastPosition = position;
if (listener != null && position > 0 && position < getCount()) {
listener.onPageScrolled(position - 1, positionOffset, positionOffsetPixels);
}
}
@Override
public void onPageSelected(int position) {
final int pos = getRealPosition(position);
if (listener != null) {
AutoScrollViewPager.this.post(new Runnable() {
@Override
public void run() {
listener.onPageSelected(pos);
}
});
}
}
@Override
public void onPageScrollStateChanged(int state) {
/**
*
*/
if (state == SCROLL_STATE_IDLE && getCount() > 1) {
// mIndicatorListener.setNext(getCurrentItem());
if (getCurrentItemOfWrapper() == 0) {
setCurrentItem(getCount() - 1, false);
} else if (getCurrentItemOfWrapper() == getCountOfWrapper() - 1) {
setCurrentItem(0, false);
}
}
if (listener != null) {
listener.onPageScrollStateChanged(state);
}
}
}
/**
* 设置轮播间隔时间
*
* @param time 时长 单位毫秒
*/
public void setDelayed(long time) {
delayTime = time;
}
}